How to Connect to a Docker Container

 

Connecting to a running Docker container is helpful when you want to see what is happening inside the container. If the Docker container doesn’t work as expected, you can attach to the container or get a shell to the container and run commands such as ps or top. You can also enter the container, install new packages, and build a new Docker image from it.

In this tutorial, we will explain how to attach to the container’s main running process and how to get a shell to a running container.

Attach to a Container

Although it is possible to run multiple processes in a container, most docker containers are running only a single process. The command that is executed when starting a container is specified using the ENTRYPOINT and/or RUN instruction.

The docker attach command allows you to attach your terminal to the running container. This is useful when you want to see what is written in the standard output in real-time, or to control the process interactively.

To better understand how the attach command works let’s run a new detached Nginx container using the official Nginx image.

docker container run --name my_nginx -d -p 8080:80 nginx

The -p 8080:80 option tells Docker to map port 80 in the container to port 8080 on the host machine.

List the containers to make sure the “my_nginx” container is running:

docker container ls

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES

8e1c4974a8d8        nginx               "nginx -g 'daemon of…"   3 minutes ago       Up 2 seconds        0.0.0.0:8080->80/tcp   my_nginx

Attach to the container using the container’s ID or name:

docker container attach my_nginx

The default command of the nginx image which is executed when you run the container is set to CMD ["nginx", "-g", "daemon off;"]. When you run the attach command your terminal attaches to the nginx process.

Open 127.0.0.1:8080 in your browser and you can watch the output of the nginx process in real time.

192.168.33.1 - - [04/Oct/2019:21:12:28 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.75 Safari/537.36" "-"

192.168.33.1 - - [04/Oct/2019:21:12:28 +0000] "GET /favicon.ico HTTP/1.1" 404 555 "http://192.168.33.71:8080/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.75 Safari/537.36" "-"

To get access to the container logs you should prefer using the docker logs command.

To detach from the container without stopping it, use the CTRL-p CTRL-q key combination. Pressing CTRL-c stops the container.

If the running processes you are attaching to accepts input, you can send instructions to it.

Get a Shell to a Container

The docker exec command allows you to run commands inside a running container.

To see how the exec command works and how it can be used to enter the container shell, first, start a new container. We’ll use the official MySQL image:

docker container run --name my_mysql -d mysql

This will create a container named “my_mysql”.

To execute a command inside the container run the following command:

docker container exec -it my_mysql ls /var

The -i option stands for interactive, and -t tells Docker to allocate a pseudo TTY device. The ls command will list all files and directories inside container’s /var directory:

backups  cache  lib  local  lock  log  mail  opt  run  spool  tmp

To get a shell to the container i.e., to enter inside the container, start a new shell session by executing the shell binary. You can use shbash, or any other shell that is included in the image.

The command below will create a new Bash session inside the container:

docker container exec -it my_mysql /bin/bash

Your command prompt will change, indicating that you’re now working on the container shell.

From here, you can run commands in the same way as you would do on any other Linux server. For example, to get a list of the current environment variables type env:

env

The output will look something like this:

HOSTNAME=e0214d97e0fe

MYSQL_ROOT_PASSWORD=my-secret-pw

PWD=/

HOME=/root

MYSQL_MAJOR=8.0

GOSU_VERSION=1.7

MYSQL_VERSION=8.0.17-1debian9

TERM=xterm

SHLVL=1

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

_=/usr/bin/env

Conclusion

The docker exec and docker attach commands allow you to connect to a running container. To get an interactive shell to a container, use the exec command to start a new shell session. The attach command attaches your terminal to a running container.